import originAxios from 'axios';

import { BASE_URL, TIMEOUT } from './config'

export default function request(option) {
	return new Promise((resolve, reject) => {
		// 1.创建axios的实例
		const instance = originAxios.create({
			baseURL: BASE_URL,
			timeout: TIMEOUT,
			retry: 10,
			retryInterval: 100
		});

		// 配置请求和响应拦截
		instance.interceptors.request.use(config => {
			// console.log('来到了request拦截success中');
			// 1.当发送网络请求时, 在页面中添加一个loading组件, 作为动画

			// 2.某些请求要求用户必须登录, 判断用户是否有token, 如果没有token跳转到login页面

			// 3.对请求的参数进行序列化(看服务器是否需要序列化)
			// config.data = qs.stringify(config.data)
			// console.log(config);

			// 4.等等
			return config
		}, err => {
			// console.log('来到了request拦截failure中');
			return err
		})

		// instance.interceptors.response.use(response => {
		// 	// console.log('来到了response拦截success中');
		// 	return response.data
		// }, err => {
		// 	console.log('来到了response拦截failure中');
    //   console.log(err);
    //   if (err && err.response) {
		// 		switch (err.response.status) {
		// 			case 400:
		// 				err.message = '请求错误'
		// 				break
		// 			case 401:
		// 				err.message = '未授权的访问'
		// 				break
		// 			default:
		// 				err.message = "其他错误信息"
		// 		}
		// 	}
		// 	return err
		// })

		instance.interceptors.response.use(response => {
			// console.log('来到了response拦截success中');
			return response.data
		}, err => {
			const config = err.config
        //如果配置不存在或重试属性未设置，抛出promise错误
        if (!config || !config.retry) return Promise.reject(err)
        //设置一个变量记录重新请求的次数
        config.retryCount = config.retryCount || 0
        // 检查重新请求的次数是否超过我们设定的请求次数
        if (config.retryCount >= config.retry) {
            return Promise.reject(err)
        }
        //重新请求的次数自增
        config.retryCount += 1
        // 创建新的Promise来处理重新请求的间隙
        const back = new Promise(function(resolve) {
            console.log("接口"+config.url+"请求超时，重新请求")
            setTimeout(function() {
                resolve();
            }, config.retryInterval|| 1)
        })
        //返回axios的实体，重试请求
        return back.then(function() {
            return instance(config)
        })
		})

		// 2.传入对象进行网络请求
		instance(option).then(res => {
			resolve(res)
		}).catch(err => {
			reject(err)
		})
	})
}
